package io.sage.modules.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author xujh
 * @email jhang_mail@163.com
 */
@RestController
@RequestMapping("upload")
public class UploadController {
	
	private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);

	   // @Value("upload_file")
	    private String uploadFile="D:\\img\\";
	    private String uploaded="uploaded";

	    //文件上传相关代码
	    @RequestMapping(value = "upload", method = RequestMethod.POST)
	    public String upload(@RequestParam("file") MultipartFile file){
	        if (file.isEmpty()) {
	            return "文件为空";
	        }
	        // 获取文件名
	        String fileName = file.getOriginalFilename();
	        logger.info("上传的文件名为：" + fileName);
	        // 获取文件的后缀名
	        String suffixName = fileName.substring(fileName.lastIndexOf("."));
	        logger.info("上传的后缀名为：" + suffixName);
	        // 解决中文问题，liunx下中文路径，图片显示问题
	        // fileName = UUID.randomUUID() + suffixName;
	        String filePrefix = UUID.randomUUID().toString();
	        File dest = new File(uploadFile + filePrefix + suffixName);
	        // 检测是否存在目录
	        if (!dest.getParentFile().exists()) {
	            dest.getParentFile().mkdirs();
	        }
	        try {
	            file.transferTo(dest);
	            return "上传成功";
	        } catch (IllegalStateException e) {
	            logger.error("===请求文件上传==="+e.getMessage());
	        } catch (IOException e) {
	            logger.error("===请求文件上传==="+e.getMessage());
	        }
	        return "上传失败";
	    }
	    
	    /**
	     * 上传文件，到项目webapp的uploaded下面
	     * @param req
	     * @param file
	     * @param m
	     * @return
	     */
	    @PostMapping("/upload1") // 等价于 @RequestMapping(value = "/upload", method = RequestMethod.POST)
	    public String uplaod(HttpServletRequest req, @RequestParam("file") MultipartFile file, Model m) {
	    	String fileName ="";
	    	//1. 接受上传的文件  @RequestParam("file") MultipartFile file
	        try {
	            //2.根据时间戳创建新的文件名，这样即便是第二次上传相同名称的文件，也不会把第一次的文件覆盖了
	            fileName = System.currentTimeMillis() + file.getOriginalFilename();
	            //3.通过req.getServletContext().getRealPath("") 获取当前项目的真实路径，然后拼接前面的文件名
	            String destFileName = req.getServletContext().getRealPath("") + uploaded + File.separator + fileName;
	            //4.第一次运行的时候，这个文件所在的目录往往是不存在的，这里需要创建一下目录（创建到了webapp下uploaded文件夹下）
	            File destFile = new File(destFileName);
	            destFile.getParentFile().mkdirs();
	            //5.把浏览器上传的文件复制到希望的位置
	            file.transferTo(destFile);
	            //6.把文件名放在model里，以便后续显示用
	            m.addAttribute("fileName", fileName);
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	            return "上传失败," + e.getMessage();
	        } catch (IOException e) {
	            e.printStackTrace();
	            return "上传失败," + e.getMessage();
	        }

	        return uploaded+fileName;
	    }
	    
	    
	    /**
	     * 删除文件
	     * @param req
	     * @param file
	     * @param m
	     * @return
	     */
	    @PostMapping("/del") // 等价于 @RequestMapping(value = "/upload", method = RequestMethod.POST)
	    public String del(HttpServletRequest req, String fileName) throws IOException {
	   
	    	//3.通过req.getServletContext().getRealPath("") 获取当前项目的真实路径，然后拼接前面的文件名
	    	String realPath = req.getServletContext().getRealPath("")+ "uploaded\\" +fileName;

			//4.第一次运行的时候，这个文件所在的目录往往是不存在的，这里需要创建一下目录（创建到了webapp下uploaded文件夹下）
			File destFile = new File(realPath);
			boolean delete = destFile.delete();
			System.out.println(delete);

	        return "showImg";
	    }

}
